# 抖码算法，让算法学习变得简单有趣
# 作者：老汤


import heapq

# 这里使用优先队列，如果你不熟悉优先队列，请学习：
# ① 课程 A【中级篇三：堆和优先队列】 第 1 节到第 6 节，链接：https://yjs.xet.tech/s/1h62x9


# 1. 输入数据处理
data = str(input()).split(" ")
m, n = int(data[0]), int(data[1])
data = str(input()).split(" ")
task_times = [0] * n
for i in range(n):
    task_times[i] = int(data[i])

# 2. 将所有任务放入到小顶堆
# 这样可以很快的拿到时间最短的任务
pq = task_times[0:n]
heapq.heapify(pq)

# 3. 处理器并行处理任务
# 定义一个 m 长度的数组，模拟 m 条流水线
# 然后不断将堆顶的任务并行放入到 m 条流水线中
slots = [0] * m
while len(pq) > 0:
    for i in range(m):
        if len(pq) > 0:
            slots[i] += heapq.heappop(pq)
        else:
            break

# 4. 拿到所有流水线中，耗时最长的流水线，其耗时就是整个耗时
max_time = 0
for i in range(m):
    max_time = max(max_time, slots[i])

print(max_time)